package com.zlop.common.exception;

import java.util.Arrays;

import com.zlop.common.utils.MessageUtils;
 

/**
 * 基础异常类
 * 
 * @author	曾令鹏
 * @since	1.0
 * @version 2018年5月8日 曾令鹏
 */
public class BaseException extends RuntimeException {

	/**
	 * 序列化ID
	 */
	private static final long serialVersionUID = 1L; 

	/**
	 * 所属应用
	 */
	private String app;

	/**
	 * 错误码
	 */
    protected Integer code;

	/**
	 * 错误码对应的参数
	 */
	private Object[] args;

	/**
	 * 错误消息
	 */
	private String defaultMessage = "未知错误";

	/**
	 * 空构造函数
	 */
	public BaseException() {
	}

	/**
	 * 构造函数
	 *
	 * @param throwable
	 *            throwable
	 */
	public BaseException(Throwable throwable) {
		super(throwable);
	}

	/**
	 * 构造函数
	 *
	 * @param message
	 *            消息
	 */
	public BaseException(String message) {
		super(message);
	}

	/**
	 * 构造函数
	 *
	 * @param message
	 *            消息
	 * @param throwable
	 *            异常
	 */
	public BaseException(String message, Throwable throwable) {
		super(message, throwable);
	}

	/**
	 * 构造函数
	 *
	 * @param app
	 *            应用名称
	 * @param code
	 *            错误编码
	 */
	public BaseException(String app, Integer code) {
		this.app = app;
		this.code = code;
	}

	/**
	 * 构造函数
	 *
	 * @param app
	 *            应用名称
	 * @param code
	 *            错误编码
	 * @param args
	 *            参数
	 */
	public BaseException(String app, Integer code, Object[] args) {
		this.app = app;
		this.code = code;
		this.args = args;
	}

	/**
	 * 构造函数
	 *
	 * @param app
	 *            应用名称
	 * @param code
	 *            编码
	 * @param args
	 *            参数
	 * @param defaultMessage
	 *            默认消息
	 */
	public BaseException(String app, Integer code, Object[] args,
			String defaultMessage) {
		this.app = app;
		this.code = code;
		this.args = args;
		this.defaultMessage = defaultMessage;
	}

	/**
	 * 构造函数
	 *
	 * @param app
	 *            应用名称
	 * @param code
	 *            错误编码
	 * @param args
	 *            参数
	 * @param throwable
	 *            异常
	 */
	public BaseException(String app, Integer code, Object[] args,
			Throwable throwable) {
		super(throwable);
		this.app = app;
		this.code = code;
		this.args = args;
	}

	/**
	 * 构造函数
	 *
	 * @param app
	 *            应用名称
	 * @param code
	 *            编码
	 * @param args
	 *            参数
	 * @param defaultMessage
	 *            默认消息
	 * @param throwable
	 *            异常
	 */
	public BaseException(String app, Integer code, Object[] args,
			String defaultMessage, Throwable throwable) {
		super(throwable);
		this.app = app;
		this.code = code;
		this.args = args;
		this.defaultMessage = defaultMessage;
	}

	/**
	 * 获取消息
	 *
	 * @return String 消息
	 */
	@Override
	public String getMessage() {
		String strMessage = null;
		if (code != null) {
			strMessage = MessageUtils.message(String.valueOf(code), args);
		}
		if (strMessage == null) {
			strMessage = defaultMessage;
		}
		return strMessage;
	}

	/**
	 * 获取应用名称
	 *
	 * @return app 应用名称
	 */
	public String getApp() {
		return app;
	}

	/**
	 * 获取错误编码
	 *
	 * @return code 错误编码
	 */
	public Integer getCode() {
		return code;
	}

	/**
	 * 获取参数
	 *
	 * @return args 参数
	 */
	public Object[] getArgs() {
		return args;
	}

	/**
	 * 获取消息
	 *
	 * @return defaultMessage 消息
	 */
	public String getDefaultMessage() {
		return defaultMessage;
	}

	/**
	 * 重写
	 *
	 * @return toString
	 */
	@Override
	public String toString() {
		return this.getClass() + "{" + "app='" + app + '\'' + ", code=" + code
				+ ", args=" + Arrays.toString(args) + ", message='"
				+ this.getMessage() + '\'' + '}';
	}
}
